/*
 * archivo_versionado.h
 *
 *  Created on: 21/09/2013
 *      Author: AXL
 */

#ifndef ARCHIVO_VERSIONADO_H_
#define ARCHIVO_VERSIONADO_H_

#define ERROR -1

#include <stdio.h>
#include <string.h>
#include <sys/stat.h>
#include "Lista.h"
#include "Cola.h"
#include "validaciones.h"
#include "file_manage.h"
#include "utils.h"

typedef struct
{
	char* ruta; /* ruta al archivo versionado */
	TListaSimple revisiones; /* historial de cambios */
} TAV;

typedef struct
{
	int num;/*numero de revision*/
	char* comentario; /*comentarios de la rivision*/
	char* fecha; /*fecha de la revision*/
} info_revision_t;

typedef struct
{
	TCola cambios;
	info_revision_t info;
} revision_t;

typedef enum
{
	TAV_INSE, TAV_ELIM
} tipo_cambio_t;

typedef enum
{
	TAV_CREAR, TAV_USAR
} modo_uso_t;

typedef struct
{
	tipo_cambio_t tipo;
	int pos;
	char* texto;
} cambio_t;

/**
 * Abre un archivo para gestionar su historial de versiones.
 * PRE:  	tav tiene suficiente memoria reservada para una estructura
 * 		 	de tipo TAV. ruta es la ruta al archivo, alocada y terminada en \0.
 * RETURN: 	 0	archivo existe, está versionado y lo abre.
 * 			 1  archivo existe y no está versionado.
 * 		 	-1  Si hubo algún error.
 */
int TAV_Abrir( TAV* tav, const char*ruta, modo_uso_t );

/**
 * Cierra el archivo tav.
 * PRE:  	tav abierto.
 * POST: 	Archivo cerrado.
 * RETURN:	 0 	el archivo se cerró satisfactoriamente.
 * 			-1	si ocurrió algún error.
 */
int TAV_Cerrar( TAV* tav );

/**
 * Quita la funcionalidad de versionado al archivo tav.
 * PRE:  	tav abierto.
 * POST: 	archivo cerrado.
 * RETURN: 	-1 	ocurrió algún error.
 * 			 0 	estructuras de control eliminadas y tav cerrado.
 */
int TAV_Liberar( TAV* tav );

/**
 * Actualiza el historial a la versión actual del archivo.
 * PRE:   	tav abierto.
 * POST:  	Historial actualizado.
 * RETURN: 	número de revisión (entero mayor que cero)
 * 			-1 si ocurrió algún error.
 */
int TAV_Actualizar( TAV* tav, char* comentario );

/**
 * Recupera la revisión rev del archivo.
 * PRE:  	tav abierto.
 * RETURN: 	 0 	se recuperó la revisión rev del archivo.
 -1 	no existe la revisión rev.
 -2 	ocurrió otro error. Se conserva el historial intacto.
 */
int TAV_Deshacer( TAV* tav, int rev, char* comentario );

/**
 * Lee el comentario y la fecha de la revisión rev del archivo.
 * PRE:  	tav abierto.
 * 			info tiene memoria reservada para una estructura
 * 			de tipo info_revision_t.
 * RETURN:	 0 	devolvió en coment el comentario y en fecha la fecha
 * 				de la revisión rev del archivo.
 * 			-1 	no existe la revisión rev.
 * 			-2	ocurrió otro error.
 */
int TAV_GetInfoRevision( TAV* tav, int *rev, info_revision_t* info );

/**
 * Lee el comentario y la fecha de todas las revisiones del archivo.
 * PRE:  	tav abierto. info apunta a una lista simple creada y vacía
 * 			para contener objetos de tipo info_revision_t.
 * RETURN:	 0 	devolvió en info una lista de objetos info_revision_t
 * 				con los datos de cada una de las revisiones del archivo.
 * 			-1 	ocurrió un error y la lista permanece inalterada.
 */
int TAV_GetListaRevisiones( TAV* tav, TListaSimple* info );

#endif /* ARCHIVO_VERSIONADO_H_ */
